package com.cn.ycy.transaction;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

@Component
public class JdbcTempleteServiceImpl {

    @Autowired
    JdbcTempleteDAO jdbcTempleteDemo;

    /**
     * 外层的方法没有声明@Transactional注解，事务 互相独立不影响
     *
     * @throws Exception
     */
    public void noTransaction() {
        jdbcTempleteDemo.insert13();
        jdbcTempleteDemo.insert14();
    }

    @Transactional
    public void startTransaction() {
        jdbcTempleteDemo.insert13();
        jdbcTempleteDemo.select();
        // 必须是RuntimeException 才能回滚
        throw new RuntimeException();
    }

    /**
     * 两个操作 绑定到一个事务中
     * 异常之后 全部回滚
     */
    @Transactional
    public void insert() {
        jdbcTempleteDemo.insert13();
        jdbcTempleteDemo.insert14();
        throw new RuntimeException();
    }

    /**
     * id = 16 单独一个事务
     * id = 15 绑定到一个事务
     * id = 15 重复插入，报异常之后，事务回滚，但是不影响id=16
     */
    @Transactional
    public void insert16() {
        // 开启一个新事务
        jdbcTempleteDemo.insert16();
        // 和上面不在一个事务中
        jdbcTempleteDemo.insert15();
        jdbcTempleteDemo.insert15();
    }

    @Transactional
    public void insertCreateNewTransation() {
        jdbcTempleteDemo.insert15();
        // 开启一个新事务
        jdbcTempleteDemo.insert16();
        jdbcTempleteDemo.insert15();
    }

    /**
     * 高阶：insert12() 方法没有 声明 @Transactional 但是 id=15异常之后，id = 12 事务回滚了
     * 原因：jdbcTemplate  和  mybatis 获取connection 都是从 DataSourceUtils 获取的数据源
     * <p>
     * 获取和提交connection的时候 ，都是统一用了静态方法
     * 获取 Connection con = DataSourceUtils.getConnection(obtainDataSource());
     * 提交 DataSourceUtils.releaseConnection(con, getDataSource());
     * ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource);
     */
    @Transactional
    public void insert12() {
        jdbcTempleteDemo.insert12();
        // 开启一个新事务
        jdbcTempleteDemo.insert15();
        jdbcTempleteDemo.insert15();
    }

}
